/**
 * @file         mfc_linux.h
 * @brief        Linux基本函数的支持
 * @note    
 * @author       Akee
 * @date         2019-9-21
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2019-9-21   <td>1.0                   <td>Akee            <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _MFC_LINUX_H_
#define _MFC_LINUX_H_
#ifdef __linux__ 
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/time.h>
#include <time.h>
#include <dlfcn.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdarg.h>
#include "ofc_types.h"
#include "sfc_api.h"
#include "mfc_types.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 是否是双字节符,即大于0x80 && 小于0xFF
 * @param b: 字符
 * @return True: 是; False: 否
 */
Bool MfIsDbcsLeadByte(Byte b);

/**
 * 得到最后错误码
 * @return 错误码
 */
Int32 MfGetLastError(void);

/**
 * 加载共享库
 * @param file_name: 文件名
 * @return  返回共享库句柄
 */
TMfModule MfLoadLibrary(const char *file_name);

/**
 * 释放共享库
 * @param lib: 共享库句柄
 * @return 结果值,参见dlclose
 */
Int32 MfFreeLibrary(TMfModule lib);

/**
 * 取共享库的函数地址
 * @param lib: 共享库句柄
 * @param proc_name: 函数名
 * @return 返回函数地址.失败返回NULL.
 */
void *MfGetProcAddress(TMfModule lib, const char *proc_name);

/**
 * 获取文件大小
 * @param h: 文件句柄
 * @param file_size_high: 该值与返回值组合成一个int64的文件大小,可以为NULL
 * @return 文件大小的低四个字节
 */
DWord MfGetFileSize(Int32 h, DWord *file_size_high);

/**
 * 取超时时间(ATimeout 为毫秒)
 * @param ts: 时间参数
 * @param timeout: 超时时间
 * @return
 */
void MfGetTimeout(struct timespec *ts, DWord timeout);

/**
 * 创建一个进程.先Fork当前进程,然后创建新进程
 * @param file_name: 需要创建进程的文件名
 * @param param1: 可选的参数1,用于传递给新进程
 * @param param2: 可选的参数2,用于传递给新进程
 * @return 返回Fork出来进程ID,如果Fork出来的进程创建FileName指定的进程成功,这个ID也就是新进程的ID,如果失败,这个ID为Fork出来的进程ID
 *　　　　 故不能依据这个返回值来判断创建新的进程是否成功.可以用RfWaitForProcessTerminate,看这个ExitCode是否为254来判断是否创建成功
 */
pid_t MfCreateProcess(const char *file_name, const char *param1, const char *param2);

/**
 * 等待进程退出
 * @param pid: 等待退出的进程ID
 * @param timeout: 等待时长,单位ms
 * @param exit_code: 用于返回退出码.注: 如果RfCreateProcess创建进程失败,这个返回码是254
 * @return True: 进程已经退出; False: 还在运行
 */
Bool MfWaitForProcessTerminate(pid_t pid, Int32 timeout, Int32 *exit_code);

#ifdef __cplusplus
}
#endif

#endif
#endif
